package com.example.springtest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.Resource;

/**
 *
 * BeanFactory 与 ApplicationContext的区别
 *
 *
 */

@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) throws Exception {

        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);

        /**
         * ApplicationContext 里的4大扩展功能
         * 1、MessageSource    处理国际化资源的能力（翻译的能力）
         * 2、ResourcePatternResolver   通配符匹配资源的能力
         * 3、EnvironmentCapable     环境信息
         * 4、ApplicationEvenPublisher  发布器
         *
         */


        /**
         * 一、国际化
         *
         * context.getMessage()
         *
         */




        /**
         * 二、获取资源
         *  context.getResources() 方法是根据路径或者通配符获取多个资源
         *  context.getResource()  方法是根据路径或者通配符获取单个资源
         *
         */

        //找到类路径下application.properties的资源
//        Resource[] resources = context.getResources("classpath:application.properties");
//
//        for (Resource resource:resources){
//            System.out.println(resource);
//        }

        //classpath*  带*可以到jar包里找
        Resource[] resources1 = context.getResources("classpath*:META-INF/spring.factories");

        for (Resource resource:resources1){
            System.out.println(resource);
        }


        /**
         * 三、环境信息
         * context.getEnvironment().getProperty();
         *
         */


        String property = context.getEnvironment().getProperty("spring.datasource.url");
        String javaHome = context.getEnvironment().getProperty("java_home");
        System.out.println("javaHome" + javaHome);
        System.out.println("property" + property);


        /**
         * 四、事件发布器
         *
         * 1、首先创建一个事件类UserRegisteredEvent
         *    然后继承ApplicationEvent类
         *
         *  2. 发布事件
         *    context.publishEvent(new UserRegisteredEvent(context));
         *
         *  3. 创建一个监听器来收事件
         *  注意：在spring中，任何一个类都可以作为监听器,只需要在需要监听的方法上加上 @EventListener注解就行
         *
         *
         */

        context.publishEvent(new UserRegisteredEvent(context));
         //调用Component2的register()方法
        Component2 bean = context.getBean(Component2.class);
        System.out.println("bean" + bean);
        bean.register();


    }

}
